

import oss2
import asyncio
from functools import partial

from app.utils.wxapp import  WxappUtils
from app.config.oss_config import OssConfig
class Oss2UploadUtil:
    def __init__(self,ossConfig:OssConfig=OssConfig()) -> None:
        """
        初始化Oss2Upload类的实例。
        
        参数:
        ossConfig - OssConfig对象，包含OSS配置信息，默认为OssConfig()。
        """
        self.ossConfig=ossConfig
        # 阿里云认证
        self.auth=oss2.Auth(ossConfig.accessKeyId,ossConfig.access_key_secretZ)
        
        self.bucket = oss2.Bucket(self.auth,ossConfig.endpoint,ossConfig.bucket_name)
        pass
    def get_oss_url(self,file_path='')->str:
        """
        获取OSS的访问URL。
        
        返回值:
        返回OSS的访问URL字符串。
        """
        return f'https://{self.ossConfig.bucket_name}.{self.ossConfig.endpoint}/{file_path}'
    async def aupload(self,upload_path:str,fileName:str,fileobj)->str:
        """
        上传文件到OSS。
        
        参数:
        upload_path - 上传路径字符串。
        fileName - 文件名字符串。
        fileobj - 文件对象。
        
        返回值:
        返回上传结果的字符串表示。
        """
        func=partial(self.bucket.put_object,f'{upload_path}/{fileName}',fileobj)
        await asyncio.get_event_loop().run_in_executor(None, func)
        file_path=self.get_oss_url(f"{upload_path}/{fileName}")
        return file_path
    def upload(self,upload_path:str,fileName:str,fileobj)->str:
        """
        上传文件到OSS。
        
        参数:
        upload_path - 上传路径字符串。
        fileName - 文件名字符串。
        fileobj - 文件对象。
        
        返回值:
        返回上传结果的字符串表示。
        """
        self.bucket.put_object(f'{upload_path}/{fileName}',fileobj)

        file_path=self.get_oss_url(f"{upload_path}/{fileName}")
        return file_path
# Oss2Upload()
if __name__ == '__main__':
    import time
    async def load():
        s=time.time()
        data=await WxappUtils().getUnlimitedQRCode(page="pages/chat/index",scene="chat_id=1")
        print(time.time()-s)
        oss=Oss2UploadUtil()
        
        res=await oss.upload('img',fileName='test.png',fileobj=data)
        print(res)
    async def  main():
        task_list=[load() for item in range(1)]
        await asyncio.gather(*task_list)
    asyncio.run(main())

        